package day05;

import javax.crypto.spec.PSource;
import java.util.Arrays;
import java.util.Random;

public class MethodDemo {
    public static void main(String[] args) {
        /*
        方法的意义
            每种编程语言中都有方法的概念，也称为：函数、过程
            作用：
                用于封装一段特定的业务逻辑功能--------------->()
            建议：
                方法应该尽可能独立，一个方法只干一件事
                方法可以被反复多次调用
            好处：
                可以减少代码重复，有利于代码维护
            何时用：
                只要是一个独立的业务功能，就可以封装到一个方法中
        方法的定义
            定义方法的五个要素：
                修饰词--->public static
                返回值类型--->方法可以有返回值，也可以无返回值。
                    1)无返回值--->返回值类型统一写成void
                    2)有返回值--->返回值类型写成特定的数据类型即可
                    何时有返回值？何时没有返回值？
                        方法执行完之后：
                            1)若还需要用到方法中的数据--->有返回值
                            2)若不需要用到方法中的数据--->无返回值
                方法名--->见名知意
                参数列表--->方法可以有参数，也可以无参数
                    有参可以使方法更加灵活
                        double c = Math.random();//只能生成0.0到0.99999999...之间的
                        假设random()有参:
                            double c = Math.random(1,1000);//生成1到1000之间的
                            double c = Math.random(0.99);//生成0到99之间的
                            double c = Math.random(10.35);//生成10到35之间的
                        方法1：pubilc static void say()
                        方法2：pubilc static int sum(int num1,int num2)
                方法体--->具体的业务逻辑实现
                    方法1：pubilc static say(){
                        //业务逻辑实现...
                    }
                    方法2：pubilc static int sum(int sum1,int sum2){
                        //业务逻辑实现...
                    }
         */


        /*
        方法的调用
            调用方法
                无返回值：方法名（有参传参）
                    public static void say(){//...}
                    调用：say();
                有返回值：数据类型 变量 = 方法名(有参传参)
                    public static int sum(int num1,int num2){//...}
                    调用：int num = sum(5,6);
         */

        say();//调用say()方法
        say();//方法可以反复多次调用...
        System.out.println("继续执行...");
        System.out.println("---------------------------------");
        //sayHi();//编译错误，有参则必须传参
        //sayHi(250);//编译错误，参数类型必须匹配
        sayHi("YXS");//String name="YXS"
        sayHi("zhangsan");
        sayHi("lisi");
        sayHi("wangwu");
        System.out.println("---------------------------------");
        sayHello("YXS",24);//String name="YXS",int age=25
        sayHello("zhangsan",25);
        sayHello("lisi",26);
        sayHello("wangwu",27);
        System.out.println("---------------------------------");
        int a = sum(5,6);
        System.out.println(a);//11----->模拟对返回值的后续操作
        int m = 5,n = 6;
        int b= sum(m,n);
        System.out.println(b);

        System.out.println("---------------------------------");

        int[] c = generateArray();//模拟第1个人的访问
        System.out.println("数组的长度："+c.length);//---模拟对方绘制的后续操作
        for (int i=0;i<c.length;i++){//---模拟对返回值的后续操作
            System.out.println(c[i]);
        }
        int[] d = generateArray();//模拟第2个人的访问
        System.out.println("第1个元素的值："+d[0]);//---模拟对返回值的后续操作
        Arrays.sort(d);//---模拟对返回值的后续操作
        for (int i=0;i<d.length;i++){//---模拟对返回值的后续操作
            System.out.println(d[i]);
        }
        int[] e = generateArray(5,10);//模拟第3个人的访问
        System.out.println("第1个元素的值："+e[0]);//---模拟对返回值的后续操作
        Arrays.sort(e);//---模拟对返回值的后续操作
        for (int i=0;i<e.length;i++){//---模拟对返回值的后续操作
            System.out.println(e[i]);
        }
        int[] f = generateArray(3,30);//模拟第3个人的访问
        System.out.println("第1个元素的值："+f[0]);//---模拟对返回值的后续操作
        Arrays.sort(f);//---模拟对返回值的后续操作
        for (int i=0;i<f.length;i++){//---模拟对返回值的后续操作
            System.out.println(f[i]);
        }

        System.out.println("---------------------------------");

        a();//111.333.222.444
        System.out.println(444);

        System.out.println("---------------------------------");

        sayHello01("zhangsan",25);
        sayHello01("lisi",66);
    }
    //无参无返回值
    public static void say(){
        System.out.println("大家好，我叫YXS，今年24岁了");
    }
    //有参无返回值
    public static void sayHi(String name){
        System.out.println("大家好，我叫"+name+"，今年24岁了");
    }
    //有参无返回值
    public static void sayHello(String name,int age){
        System.out.println("大家好，我叫"+name+"，今年"+age+"岁了");
    }
    //有参有返回值
    /*
    return
        1.return值;//1)结束方法的执行 //2)返回结果给调用方
          ---->用在有返回值的方法中
            public static int sum(int num1,int num2){
                int num = num1+num2;
                return num;
            }
        2.return;//1)结束方法的执行
          ----->用在无返回值的方法中
     */
    public static int sum(int num1,int num2){
        int num = num1+num2;
        return num;//返回的是num里面的那个数
        //return num1+num2;//返回的是num1与num2的和
    }
    //生成一个整型数组，并填充随机数据
    public static int[] generateArray(){
        Random rand = new Random();
        int[] arr = new int[10];
        for (int i=0;i<arr.length;i++){
            arr[i] = rand.nextInt(100);
        }
        return arr;
    }
    public static int[] generateArray(int len,int max){
        Random rand = new Random();
        int[] arr = new int[len];
        for (int i=0;i<arr.length;i++){
            arr[i] = rand.nextInt(max+1);//包括max
        }
        return arr;
    }
    //嵌套调用
    public static void a(){
        System.out.println(111);
        b();//方法的嵌套调用
        System.out.println(222);
    }
    public static void b(){
        System.out.println(333);
    }
    //return;
    public static void sayHello01(String name,int age){
        if (age>=50){//在某种特定条件下，提前结束方法
            return;//结束方法的执行
        }
        System.out.println("大家好，我叫"+name+"，今年"+age+"岁了");
    }

}


/*
补充：
    1.形参：形式参数，定义方法时的参数
      实参：实际参数，调用方法时的参数
 */



/*
    方法的重载(overloading)
        定义：发生在同一类中，方法名相同，参数列表不同
        绑定：编译器在编译时会根据方法的签名自动绑定方法
        重载与返回值类型无关
        重载与参数名称无关

        方法的签名：
            方法名+参数列表
            //Java规定：在同一类中，不允许出现签名完全相同的方法
                public class Test{
                    public static void say(){...}
                    public static void say(){...}//不允许
                    public static void int say(){return 1};//不允许
                }
                public class Test{
                    public static void say(){...}
                    public static void say(String name){...}//允许
                }


         void println(){
         }
         void println(int a){
         }
         void println(double b){
         }
         void println(boolean c){
         }
         void println(char d){
         }
         void println(String e){
         }

         System.out.println();
         System.out.println(25);
         System.out.println(3.14);
         System.out.println(true);
         System.out.println('你');
         System.out.println("hello");

 */





